package com.zkh.myutils.database.data.handler;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

import com.zkh.myutils.database.data.DBOperateUtils;
import com.zkh.myutils.database.data.tools.TypeAdapter;

/**
 * 处理数据方式，将数据第一列数据组成一个集合后返回。适用于多行单列。
 * @author zkh
 */
public class ColumnListHandler<T> implements Handler<List<T>> {
	
	//类型
	private Class<? extends T> type;
	//类型转换器
	private Function<Object, T> typeConverter;
	/**
	 * 构造器
	 */
	public ColumnListHandler(){}
	/**
	 * 构造器，供特定类型转换。如果类型是标准的JDBC封装类型，则调用无参构造即可。<br/>
	 * 如数据库类型是bigint，JDBC会自动转换为Long类型，所以若以Long类型来接收数据，就可以调用无参构造器，不用指定类型
	 * @param type 要转换类型的Class属性。此处不能是基础类型，可以是基础类型的包装类型，或其它（String, Date, BigDecimal, BigInteger）
	 */
	public ColumnListHandler(Class<? extends T> type){
		this.type = type;
	}
	
	/**
	 * 构造器，自定义转换器，可以根据特定需要将值转换为指定类型
	 * @param typeConverter 自定义类型转换器
	 */
	public ColumnListHandler(Function<Object, T> typeConverter) {
		this.typeConverter = typeConverter;
	}
	
	/**
	 * 处理数据的具体方法
	 */
	@SuppressWarnings("unchecked")
	public List<T> handle(ResultSet rs) throws SQLException {
		//有自定义转换器
		if(typeConverter!=null) {
			return DBOperateUtils.getColumnList(rs, typeConverter);
		}
		//容器
		List<T> ctn = new ArrayList<>();
		//字段类型
		List<Integer> typeList = new ArrayList<>();
		//获取数据
		List<Object[]> arraylist = DBOperateUtils.getArrayList(rs, typeList);
		//如果有数据
		if(!arraylist.isEmpty()){
			//遍历数据
			for(Object[] obj: arraylist){
				ctn.add((T) (type==null ? obj[0] : TypeAdapter.convertType(obj[0], type)));
			}
		}
		//返回数据
		return ctn;
	}

}
